package com.fanrenqiji.modules.sys.service;

import com.fanrenqiji.common.persistence.Page;
import com.fanrenqiji.modules.sys.entity.Menu;
import com.fanrenqiji.modules.sys.entity.Office;
import com.fanrenqiji.modules.sys.entity.Role;
import com.fanrenqiji.modules.sys.entity.User;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author lijian E-mail:ljz0721cx@163.com
 * @version 创建时间：2015年1月21日 下午12:43:40
 * @description 系统管理，安全相关实体的管理类,包括用户、角色、菜单.
 */

public interface SystemService {

	public static final String HASH_ALGORITHM = "SHA-1";
	public static final int HASH_INTERATIONS = 1024;
	public static final int SALT_SIZE = 8;
	
	/************************* UserService **********************/
	/**
	 * 通过登陆名获得有效的用户
	 * 
	 * @param username
	 * @return
	 */
	public User getUserByLoginName(String username);
	/**
	 * 通过登陆名获得存在的用户
	 * 
	 * @param username
	 * @return
	 */
	public User findByLoginName(String username);

	/**
	 * 获取所有用户
	 * @return
	 */
	public List<User> findAllUser();
	/**
	 * 通过用户id获得用户
	 * 
	 * @param id
	 * @return
	 */
	public User getUser(Long id);

	/**
	 * 修改登陆的Ip地址
	 * 
	 * @param id
	 */
	@Transactional(readOnly = false)
	public void updateUserLoginInfo(Long id);

	/**
	 * 添加或更新用户
	 * 
	 * @param user
	 */
	@Transactional(readOnly = false)
	public void saveUser(User user);

	/**
	 * 修改登陆用户的密码
	 * 
	 * @param id
	 * @param loginName
	 * @param newPassword
	 */
	@Transactional
	public void updatePasswordById(Long id, String loginName, String newPassword);
	/**
	 * 获得用户的分页数据
	 * @param page
	 * @param user
	 * @return
	 */
	public Page<User> findUserByPage(Page<User> page, User user);


	/************************* RoleService **********************/
	/**
	 * 通过id获得角色
	 * @param id
	 * @return
	 */
	public Role getRole(Long id);
	/**
	 * 获得当前登陆用户的角色
	 * @return
	 */
	public List<Role> findAllRole();
	/**
	 * 通过角色名查找角色
	 * @param name
	 * @return
	 */
	public Role findRoleByName(String name);
	/**
	 * 添加或跟新角色
	 * @param role
	 */
	@Transactional
	public void saveRole(Role role);
	/**
	 * 将用户从角色中移除
	 */
	public Boolean outUserInRole(Role role, Long userId);
	/**
	 * 将用户添加到角色中
	 */
	public User assignUserToRole(Role role, Long userId);

	/************************* MenuService **********************/
	/**
	 * 通过id获得菜单
	 * 
	 * @param id
	 * @return
	 */
	public Menu getMenu(Long id);

	/**
	 * 获得当前登陆用户的所有的菜单资源
	 * 
	 * @return
	 */
	public List<Menu> findAllMenu();

	/**
	 * 保存或更新菜单
	 * 
	 * @param menu
	 */
	public void saveMenu(Menu menu);

	/**
	 * 更新删除菜单标记为删除
	 * 
	 * @param id
	 */
	public void deleteMenu(Long id);

	/**
	 * 通过角色查询用户列表
	 * @param role
	 * @return
	 */
	public List<User> findUserByRole(Role role);
	
	/**
	 * 通过机构查询用户列表
	 * @param office
	 * @return
	 */
	public List<User> findUserByOffice(Office office);
	
	/**
	 * 查询某个机构下的所有用户，可分页
	 * @param user
	 * @return
	 */
	public Page<User> findOfficeBelowUserByPage(Page<User> page, User user);
	
	/**
	 * 查询某个机构下是否存在用户
	 * @param officeId
	 * @return
	 */
	Long findOfficeBelowIsExistUser(Long officeId);


}
